// mythread.cc
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

// 新线程个数，主线程不参与抢票
#define NUM 4

int tickets = 1000; // 用多线程，模拟一轮抢票

class threadData
{
public:
    threadData(int number)
        : _threadname("thread-" + to_string(number))
    {
    }

public:
    string _threadname;
};

void *getTicket(void *args)
{
    threadData *td = static_cast<threadData*>(args);
    const char* name = td->_threadname.c_str();
    while (1)
    {
        if (tickets > 0)
        {
            usleep(1000);  // 抢票花的时间
            printf("%s get a ticket: %d\n", name, tickets);
            tickets--;
        }
        else break;
    }
    printf("%s ... quit\n", name);

    return nullptr;
}

int main()
{
    vector<pthread_t> tids;
    vector<threadData *> thread_datas;
    for (int i = 1; i <= NUM; ++i)
    {
        pthread_t tid;
        threadData *td = new threadData(i);
        thread_datas.push_back(td);

        pthread_create(&tid, nullptr, getTicket, td);
        tids.push_back(tid);
    }

    for (auto thread : tids)
    {
        pthread_join(thread, nullptr);
    }
    for (auto td : thread_datas)
    {
        delete td;
    }

    return 0;
}



// void *threadRoutine(void *args)
// {
//     int n = 5;
//     while (n--)
//     {
//         printf("new thread\n");
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
    
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, nullptr);
    
//     sleep(1);
//     pthread_exit(nullptr);
//     //pthread_join(tid, nullptr);

//     return 0;
// }




// #define NUM 3

// // int *p = nullptr;
// __thread int g_val = 100;
// __thread unsigned int number = 0;
// __thread int pid = 0;

// string toHex(pthread_t tid)
// {
//     char buf[64];
//     snprintf(buf, sizeof(buf), "%p", tid);
//     return buf;
// }

// class threadData
// {
// public:
//     threadData(int number)
//         : _threadname("thread-" + to_string(number)), _n(number)
//     {
//     }

// public:
//     string _threadname;
//     int _n;
// };

// // 所有的线程，执行的都是这个函数
// void *threadRoutine(void *args)
// {
//     pthread_detach(pthread_self());
//     // int test_i = 0;
//     threadData *td = static_cast<threadData *>(args);
//     // if (td->_threadname == "thread-2") p = &test_i;
//     // number = pthread_self();
//     // pid = getpid();

//     int i = 10;
//     while (i--)
//     {
//         sleep(td->_n + 1);
//         // cout << "tid: " << toHex(number) << ", pid: " << pid << endl;
//         cout << "pid: " << getpid() << ", tid: " << toHex(pthread_self())
//              << ", threadname: " << td->_threadname
//              << ", g_val: " << g_val << ", &g_val: " << &g_val << endl;
//         // sleep(1);
//         // ++test_i;
//         ++g_val;
//     }
//     delete td;
//     return nullptr;
// }

// int main()
// {
//     // 创建多线程
//     vector<pthread_t> tids;
//     for (int i = 0; i < NUM; ++i)
//     {
//         pthread_t tid;
//         threadData *td = new threadData(i);
//         pthread_create(&tid, nullptr, threadRoutine, td);
//         tids.push_back(tid);
//         // sleep(1);
//     }

//     sleep(5); // 确保复制成功，p拿到线程2的&test_i
//     // cout << "main thread get a thread local value, val: " << *p << ", &val: " << p << endl;

//     // 线程分离
//     // for (auto i : tids)
//     // {
//     //     pthread_detach(i);
//     // }

//     // 线程等待
//     for (int i = 0; i < tids.size(); ++i)
//     {
//         int n = pthread_join(tids[i], nullptr);
//         printf("n = %d, who: %p, why: %s\n", n, tids[i], strerror(n));
//     }

//     return 0;
// }